home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / Mops 2.7 / Mops source / Asm Source / ic1 < prev    next >
Text File  |  1994-05-08  |  8KB  |  447 lines

  1. \ Instruction Classes           Reese Warner                    3/85
  2. \      8/85  RW   added comments
  3. \      8/85  RW   Added Neon mode
  4. \      9/85  RW   Added type 26, sized single ea instruction
  5. \      9/85  RW   Added type27, for the STOP instruction
  6. \     12/85  JF   fixed LENGTH: method on TYPE3
  7. \  03/07/86  GDC  fixed type 7 BUILD:
  8. \  2-Oct-86  MRH  fixed type4 BUILD:
  9. \ 11-May-87  MRH  added range checking for immediates, shifts, ADDQ, SUBQ
  10. \  9-Aug-87  MRH  fixed type9 BUILD:
  11.  
  12. 0 -> dlevel
  13.  
  14. :CLASS machInst    super(  object  )
  15. record
  16. {    var bytecode
  17.     int srcMask
  18.     int dstMask
  19.     int theSize
  20. }
  21.  
  22. :M INIT:  { opcode -- }
  23.     opcode put: bytecode
  24.     hex
  25.     intrp1  put: srcMask        \ reads sourcemask
  26.     intrp1  put: dstMask        \ reads destination mask
  27.     intrp1  put: theSize        \ reads the default machine code size
  28.     decimal
  29. ;M
  30.  
  31. :M BC:        \ debug
  32.     hex get: bytecode ." bytecode is " u. cr decimal
  33. ;M
  34.  
  35. :M MASKS:    \ debug
  36.     hex get: srcMask ." src is " u. cr
  37.     get: dstMask ." dst is " u. cr  decimal
  38. ;M
  39.  
  40. :M OPFMT:
  41.     get: theSize
  42. ;M
  43.  
  44. :m PRINT:
  45.     ." class is "  .class: self  cr
  46.     bc: self  masks: self
  47.     ." size is "  get: theSize  .  cr  ;m
  48.  
  49. ;CLASS
  50.  
  51. \ TYPE1 - No operand instructions, such as Reset.
  52. :CLASS type1 super(  machinst  )
  53.  
  54. :M BUILD:
  55.     get: bytecode w,
  56. ;M
  57.  
  58. :M LENGTH: ( -- len )
  59.     1
  60. ;M
  61.  
  62. ;CLASS
  63.  
  64. \ TYPE2 - Register, immediate value, such as Link
  65. \  e.g. Link A0,#100
  66. :CLASS type2 super(  machinst  )
  67.  
  68. :M BUILD:   { \ workSpace -- }
  69.     op1 getOp
  70.     get: bytecode -> workSpace
  71.     workSpace reg: op1 or w,
  72.     op2 getOp
  73.     value: op2 w,
  74. ;M
  75.  
  76. :M LENGTH: ( -- len )
  77.     op1 getOp
  78.     op1 get: srcMask check
  79.     op2 getOp
  80.     op2 get: dstMask check
  81.     2
  82. ;M
  83.  
  84. ;CLASS
  85.  
  86. \ TYPE3 - Instructions that take an immediate operand, such as ANDI, EORI
  87. \  e.g. EORI.W #100,-(A4)
  88. :CLASS type3 super(  machinst  )
  89.  
  90. :M BUILD:   { \ workSpace -- }
  91.     op1 getOp
  92.     op2 getOp
  93.     get: bytecode -> workSpace
  94.     opFmt 6 << workSpace or -> workSpace
  95.     ea: op2 workspace or -> workSpace
  96.     workSpace w,
  97.     value: op1      \ immediate Data
  98.     opFmt
  99.     CASE
  100.     0    OF    249 byteChk  w,    ENDOF
  101.     1    OF    249 wordChk  w, ENDOF
  102.     ( 2, presumably )  drop  ,  0
  103.     ENDCASE
  104.     op2 compIdxMode
  105. ;M
  106.  
  107. :M LENGTH:  { \ size -- len }
  108.     op1 getOp
  109.     op1 get: srcMask check
  110.     op2 getOp
  111.     op2 get: dstMask check
  112.     2 -> size
  113.     op2 modeSize ++> size
  114.     opFmt 1- 0 max ++> size   \ '1 max' -> '1- 0 max' jaf 12/17
  115.     size
  116. ;M
  117.  
  118. ;CLASS
  119.  
  120. \ TYPE4 - Instructions that take a reg, an effective Addr, an opmode
  121. \  e.g. OR.L D0,(SP)
  122.  
  123. :CLASS type4 super(  machinst  )
  124.  
  125. :M BUILD:   { \ opMode Reg EA workSpace flag -- }
  126.     op1 getOp  op2 getOp
  127.     true -> flag
  128.      mode: op2 1 =
  129.     IF
  130.         opFmt 2 =
  131.         IF
  132.             7 -> opMode
  133.         ELSE
  134.             3 -> opMode
  135.         THEN
  136.         reg: op2 -> reg
  137.         ea: op1 -> ea
  138.         false -> flag
  139.     THEN
  140.     mode: op2 0=  flag and
  141.     get: srcMask 1 <> and       \ Don't let EOR Dm,Dn come here - MRH
  142.     IF
  143.         opFmt -> opMode
  144.         reg: op2 -> reg
  145.         ea: op1 -> ea
  146.         false -> flag
  147.     THEN
  148.     mode: op1 0= flag and
  149.     IF
  150.         opFmt 4+ -> opMode
  151.         reg: op1 -> reg
  152.         ea: op2 -> ea
  153.         false -> flag
  154.     THEN
  155.     flag
  156.     IF
  157.         219 asmERROR   \ at least one operand must be a register direct
  158.     THEN
  159.     get: bytecode -> workSpace
  160.     reg 9 << workSpace or -> workspace
  161.     opMode 6 << workSpace or -> workSpace
  162.     ea workSpace or -> workSpace
  163.     workSpace w,
  164.     op1 compIdxMode
  165.     op2 compIdxMode
  166. ;M
  167.  
  168. :M LENGTH:  { \ len -- len }
  169.     op1 getOp
  170.     op1 get: srcMask check
  171.     op2 getOp
  172.     op2 get: dstMask check
  173.     1 -> len
  174.     op1 modesize ++> len
  175.     op2 modesize ++> len
  176.     len
  177. ;M
  178.  
  179. ;CLASS
  180.  
  181. \ TYPE5 - reg & ea, unsized e.g. LEA <ea>,A3
  182. :CLASS type5 super(  machinst  )
  183.  
  184. :M BUILD:   { \ workSpace -- }
  185.     op1 getOp
  186.     op2 getOp
  187.     get: bytecode -> workSpace
  188.     reg: op2 9 << workSpace or -> workSpace
  189.     ea: op1 workSpace or -> workSpace
  190.     workSpace w,
  191.     op1 compIdxMode
  192. ;M
  193.  
  194. :M LENGTH:  ( -- len )
  195.     op1 getOp
  196.     op1 get: srcMask check
  197.     op2 getOp
  198.     op2 get: dstMask check
  199.     1 op1 modeSize +
  200. ;M
  201.  
  202. ;CLASS
  203.  
  204. \ TYPE6 - Branch instructions - Bcc, BRA, BSR
  205.  
  206. :CLASS type6 super(  machinst  )
  207.  
  208. :M BUILD:
  209.     op1 getOp  get: bytecode
  210.     op1 abs: operand  dup  NIF  245 asmError  THEN    \ wrong mode
  211.     here 2+ -
  212.     opFmt Sfmt =
  213.     IF    250 byteChk  $ FF and or  w,
  214.     ELSE    swap  w,  250 wordChk  w,
  215.     THEN
  216. ;M
  217.  
  218. :M LENGTH:
  219.     op1 getOp
  220.     op1 get: srcMask check
  221.     opFmt Sfmt = IF  1  ELSE  2  THEN
  222. ;M
  223.  
  224. ;CLASS
  225.  
  226. \ TYPE7 - Bit test operations: BCLR,BSET,BTST,BCHG
  227. \  e.g. BTST D5,-(A4) or BTST #5,-(A4)
  228. :CLASS type7 super(  machinst  )
  229.  
  230. :M BUILD:   { \ workSpace -- }
  231.     op1 getOp
  232.     op2 getOp
  233.     get: bytecode -> workSpace
  234.     mode: op1 0=
  235.     IF
  236.         reg: op1 9 << workSPace or -> workSpace
  237.         ea: op2 workSpace or -> workSpace
  238.         256 workspace or -> workspace
  239.         workSpace w,
  240.     ELSE
  241.         ea: op2 workSpace or -> workSpace
  242.         2048 workspace or -> workSpace
  243.         workSpace w,
  244.         value: op1 w,
  245.     THEN
  246.     op2 compIdxMode
  247. ;M
  248.  
  249. :M LENGTH:  { \ len -- len }
  250.     op1 getOp
  251.     op1 get: srcMask check
  252.     op2 getOp
  253.     op2 get: dstMask check
  254.     mode: op1 0=
  255.     IF
  256.         1 -> len
  257.     ELSE
  258.         2 -> len
  259.     THEN
  260.     len
  261. ;M
  262.  
  263. ;CLASS
  264.  
  265. \ TYPE8 - single ea instructions. E.G. PEA aLabel
  266. :CLASS type8 super(  machinst  )
  267.  
  268. :M BUILD:
  269.     op1 getOp
  270.     get: bytecode  ea: op1  or  w,
  271.     op1 compIdxMode
  272. ;M
  273.  
  274. :M LENGTH:  { \ len - len }
  275.     op1 getOp
  276.     op1 get: srcMask  check
  277.     1 -> len 
  278.     op1 modeSize ++> len
  279.     len
  280. ;M
  281.  
  282. ;CLASS
  283.  
  284. \ TYPE9 - EXG A2,D4
  285. :CLASS type9 super(  machinst  )
  286.  
  287. :M BUILD:
  288.     op1 getOp
  289.     op2 getOp
  290.     reg: op2  reg: op1
  291.     mode: op1 0=  mode: op2 0=  and
  292.     IF                    \ Both D regs
  293.         $ 40
  294.     ELSE
  295.         mode: op1  mode: op2  and
  296.         IF                \ Both A regs
  297.             $ 48
  298.         ELSE                \ One D, one A
  299.             mode: op1
  300.             IF  ( A is first, but needs to be second )
  301.                 swap
  302.             THEN
  303.             $ 88
  304.         THEN
  305.     THEN
  306.     swap  9 <<  or  or  get: bytecode  or  w,
  307. ;M
  308.  
  309. :M LENGTH: ( -- len )
  310.  
  311.     op1 getOp
  312.     op1 get: srcMask check
  313.     op2 getOp
  314.     op2 get: dstMask check
  315.     1
  316. ;M
  317.  
  318. ;CLASS
  319.  
  320. \ TYPE10 - EXT.L DO
  321. :CLASS type10 super(  machinst  )
  322.  
  323. :M BUILD:   { \ work -- }
  324.     op1 getOp
  325.     get: bytecode -> work
  326.     reg: op1 work or -> work
  327.     opFmt 1+  2 max 6 << work or -> work       \ set opMode field
  328.     work w,
  329. ;M
  330.  
  331. :M LENGTH:
  332.     op1 getOp
  333.     op1 get: srcMask check
  334.     1
  335. ;M
  336.  
  337. ;CLASS
  338.  
  339.  
  340. : ShortImmAdjust    \ ( n -- n' )
  341.     dup  1 8 inRange?
  342.     IF    7 and  9 <<
  343.     ELSE    249 asmError
  344.     THEN   ;
  345.  
  346.  
  347. \ TYPE11 - Shift operations e.g. LSL.W #2,D0
  348. :CLASS type11 super(  machinst  )
  349.  
  350. :M BUILD:   { \ work val -- }
  351.     op1 getOp
  352.     get: bytecode -> work
  353.     mode: op1 11 = mode: op1 0= or
  354.     IF
  355.         opFmt 6 << work or -> work
  356.         op2 getOp
  357.         mode: op1 0=
  358.         IF
  359.             32 work or -> work
  360.             reg: op1 9 << work or -> work
  361.         ELSE
  362.             value: op1  shortImmAdjust  ++> work
  363.         THEN
  364.         reg: op2 work or -> work
  365.         work w,
  366.     ELSE
  367.         192 work or -> work
  368.         ea: op1 work or w,
  369.         op1 compIdxMode
  370.     THEN
  371. ;M
  372.  
  373. :M LENGTH: { \ len -- len }
  374.     op1 getOp
  375.     op1 get: srcMask check
  376.     mode: op1 11 = mode: op1 0= or
  377.     IF
  378.         op2 getOp
  379.         op2 get: dstMask check
  380.         1 -> len
  381.     ELSE
  382.         1 op1 modeSize + -> len
  383.     THEN
  384.     len
  385. ;M
  386.  
  387. ;CLASS
  388.  
  389. \ TYPE12 - ADDQ, SUBQ
  390. \  e.g. ADDQ.L #4,D6
  391. :CLASS type12 super(  machinst  )
  392.  
  393. :M BUILD:   { \ work -- }
  394.     op1 getOp
  395.     op2 getOp
  396.     get: bytecode -> work
  397.     value: op1  shortImmAdjust  ++> work
  398.     opFmt 6 << work or -> work
  399.     ea: op2 work or -> work
  400.     work w,
  401.     op2 compIdxMode
  402. ;M
  403.  
  404. :M LENGTH:  ( -- len )
  405.     op1 getOp
  406.     op1 get: srcMask check
  407.     op2 getOp
  408.     op2 get: dstMask check
  409.     1 op2 modeSize +
  410. ;M
  411.  
  412. ;CLASS
  413.  
  414. \ TYPE13 - ABCD, SBCD
  415. \  e.g. ABCD D1,D2 or ABCD -(A4),-(A3)
  416. :CLASS type13 super(  machinst  )
  417.  
  418. :M BUILD:       { \ work -- }
  419.     op1 getOp
  420.     op2 getOp
  421.     get: bytecode -> work
  422.     reg: op1 work or -> work
  423.     reg: op2 9 << work or -> work
  424.     mode: op1 0= not
  425.     IF
  426.         8 ++> work
  427.     THEN
  428.     work w,
  429. ;M
  430.  
  431. :M LENGTH:      { \ len -- len }
  432.     op1 getOp
  433.     op1 get: srcMask check
  434.     op2 getOp
  435.     op2 get: dstMask check
  436.     mode: op1 mode: op2 = not 
  437.     IF
  438.         207 asmError
  439.     THEN
  440.     1 -> len
  441.     op1 modesize ++> len
  442.     op2 modesize ++> len
  443.     len
  444. ;M
  445.  
  446. ;CLASS
  447.